problem s vynimkou

Otázka od: p.sestak@corag.sk

15. 7. 2004 12:07

Mam problem so zachytavanim vynimiek.
v tejto metode za urcitych podmienok vyvolam vynimku EFOpenError:

constructor TLogFile.create( aFileName : String; _ReadOnly : boolean );
var TmpHeader : TLogHeader;
begin
 inherited Create();
 FName := aFileName;

   HFile := OpenFile( PChar(aFileName), OFStruct, ff );
   LastError := GetLastError();
   ReadFile(HFile, TmpHeader, SizeOf(TLogHeader), NumRead, Nil);
   if( TmpHeader.MagicNum <> MAGIC_NUM )
   then
    begin
   ...
     raise EFOpenError.Create('Log file ' + aFileName + ' is corrupted');
    end
   else
    begin
     LogHeader^ := TmpHeader;
     GetMem(Groups, LogHeader.SigGroupCount*SizeOf(TSigGroup));
     FillChar(Groups^, LogHeader.SigGroupCount*SizeOf(TSigGroup), 0);
     ReadFile(HFile, Groups^, LogHeader.SigGroupCount*SizeOf(TSigGroup),
NumRead, Nil);
     IsOpen := true;
     GetMem(IOBuffer, LogHeader.RecordSize);
    end;
end;//constructor TLogFile.create( aFileName : String );

Problem je v tom, ze po vyvolani tejto vynimky mi to nevyskoci von z
konstruktora ako by som predpokladal,
pretoze tam nie je nikde ziadna kostrukcia except on EFOpenError do, ale
zahadne skoci na posledny riadok:
     GetMem(IOBuffer, LogHeader.RecordSize);
a snazi sa alokovat pamat. Tu ale vznikne dalsia vynimka od systemu
'Invalid Pointer Operation'.
Takze tato mi zrusi moju vyvolanu vynimku a v kode ktory vola
inkriminovany kostruktor nezachytim
nic:

   try
      LogFile := TLogFile.Create( fneMonitoringFile.FileName , false );
   except
   on EFOpenError do
      begin
         ShowMessage('Unable to open log file: ' +
fneMonitoringFile.FileName);
      end;
   end;

Vie mi niekto poradit, preco beh programu nevyskoci priamo z konstruktoru
po volani raise EFOpenError.Create() ale
skusa este vykonat nejaky kod v tejto metode?

Pavol Sestak
ICQ: 20989081

Odpovedá: p.sestak@corag.sk

15. 7. 2004 13:59

Takze problem bol v tom, ze ako parameter do konstruktora vynimky
som daval parameter konstruktora TLogFile.create(aFileName,...).
Neviem sice preco to tu zblbne, pretoze tento parameter je alokovany
predsa o uroven vyssie ale EFOpenError si s nim jednoducho nevie poradit
a nasledne vznika vynimka "Invalid Pointer Operation" a cely handling v
konstruktore
si zacne robit co chce.

Pavol Sestak
ICQ: 20989081